#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

const int N = 5e5 + 10;

int n;
struct node
{
	int x; // 起始时间 / 结束时间
	int y; // 终止时间 / 牛棚编号
	int z; // 排序之前的编号

	bool operator<(const node& a)const
	{
		return x > a.x;
	}

}a[N];

bool cmp(node x, node y)
{
	return x.x < y.x;
}

int ret[N]; // 存最终结果

int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i].x >> a[i].y;
		a[i].z = i;
	}

	sort(a + 1, a + 1 + n, cmp); // 按照起始时间从小到大排序

	int num = 1;
	priority_queue<node> heap; // 按照结束时间的小根堆
	ret[a[1].z] = 1;
	heap.push({a[1].y, 1});

	//针对第i号奶牛，在所有的牛棚中，找出一个能放的位置
	for(int i = 2; i <= n; i++)
	{
		int l = a[i].x, r = a[i].y;
		if(l <= heap.top().x) // 无法放在已经分配奶牛的牛棚里面
		{
			//重新分配新的牛棚
			num++;
			ret[a[i].z] = num;
			heap.push({r, num});
		}
		else // 可以放在已经分配奶牛的牛棚里面
		{
			node t = heap.top(); heap.pop();
			ret[a[i].z] = t.y;
			heap.push({r, t.y});
		}
	}

	cout << num << endl;
	for(int i = 1; i <= n; i++) cout << ret[i] << endl;


	return 0;
}

